package com.vvlive.caibao.smartcity.utils;

import java.lang.reflect.Field;
import java.util.Map;

/**
 * 反射的工具类
 */
public class ReflectUtil {

	/**
	 * 得到目标实体，并执行其中的set方法
	 * @param c		class	要反射的类
	 * @param map	set方法的参数
	 * @return	object instance
	 * @throws Exception
	 */
	public static Object getTargetInstance(Class<?> c, Map<String, Object> map) throws Exception{
		Object instance = c.newInstance();	// 得到一个对象实例
		Field[] fields = c.getDeclaredFields();	// 得到属性名称
		String fieldName = null;
		for(Field field : fields){	// 遍历执行其中的set方法
			fieldName = field.getName();
			c.getDeclaredMethod(getSetter(fieldName), c.getDeclaredMethod(getGetter(fieldName)).getReturnType()).invoke(instance, map.get(fieldName));
		}
		return instance;	// 返回实例
	}

	/**
	 * 获得一个类的所有属性名
	 * @param cls
	 * @return String[] names;
	 */
	public static String[] getFieldsNames(Class<?> cls){
		Field[] fields = cls.getDeclaredFields();
		String[] names = new String[fields.length];
		int size = fields.length;
		for(int i = 0; i < size; i ++){
			names[i] = fields[i].getName();
		}
		return names;
	}

	/**
	 * 单词的首字母大写
	 * @param name
	 * @return
	 */
	private static String getFirstUpper(String name) {
		 char[] cs = name.toCharArray();
	     if(cs[0] >=97 && cs[0] <= 122){
	    	 cs[0] -= 32;
	     }
	     return String.valueOf(cs);
	}

	/**
	 * 单词首字母大写
	 * @param name
	 * @return
	 */
	private String makeFirstCap(String name){
		return String.valueOf(name.charAt(0)).toUpperCase() + name.substring(1);
	}

	/**
	 * 得到一个方法名（setter or getter）
	 * @param er 	setter or getter
	 * @param field
	 * @return
	 */
	private static String getMethodName(String er, String field){
		return er + getFirstUpper(field);
	}

	/**
	 * getter
	 * @param field
	 * @return
	 */
	private static String getGetter(String field){
		return getMethodName("get", field);
	}

	/**
	 * setter
	 * @param field
	 * @return
	 */
	private static String getSetter(String field){
		return getMethodName("set", field);
	}
}
